// Package service
// Title  		user.service.go
// Description  ClusterService服务层
// Author  		alittlexincan@163.com  		2024/07/22 11:36
// Update  		alittlexincan@163.com  		2024/07/22 11:36
package service

import (
	"net/http"

	"github.com/mitchellh/mapstructure"
	"go.uber.org/zap"
	"xincan.com.cn/tarot-go-framework/business/user/dto"
	"xincan.com.cn/tarot-go-framework/business/user/po"
	"xincan.com.cn/tarot-go-framework/business/user/vo"
	"xincan.com.cn/tarot-go-framework/global"
	"xincan.com.cn/tarot-go-framework/utils/response"
)

// UserInterface
// Title    		UserInterface
// Description   	用户接口
// Auth      		alittlexincan@163.com         时间（2024/07/22 11:36）
// Update      		alittlexincan@163.com         	时间（2024/07/22 11:36）
type UserInterface interface {
	CreateUser(model *dto.CreateUserDto) (bool, error)

	// SearchUserList 查询用户信息
	SearchUserList(model *dto.SearchUserListDto) ([]*vo.SearchUserListVo, error)
}

// UserService
// Title    		UserService
// Description   	用户接口服务实现结构体
// Auth      		alittlexincan@163.com         	时间（2024/07/22 11:36）
// Update      		alittlexincan@163.com         	时间（2024/07/22 11:36）
type UserService struct {
}

// NewUserService
// Title    		NewUserService
// Description   	创建用户接口服务实现
// Auth      		alittlexincan@163.com         	时间（2024/07/22 11:36）
// Update      		alittlexincan@163.com         	时间（2024/07/22 11:36）
// Return 			UserService						返回用户接口服务实现结构体
func NewUserService() *UserService {
	return &UserService{}
}

// CreateUser 创建用户
// Auth      		alittlexincan@163.com         						时间（2024/07/22 11:36）
// Update      		alittlexincan@163.com         						时间（2024/07/22 11:36）
// Param 			model					*dto.CreateUserDto			创建用户参数
// Return 			bool												创建用户结果
// Return 			error												创建用户错误
func (user *UserService) CreateUser(model *dto.CreateUserDto) (bool, error) {

	var createUser *po.User

	if mttErr := mapstructure.Decode(model, &createUser); mttErr != nil {
		global.Logger.Error("参数转换失败", zap.Any("model", model), zap.Error(mttErr))
		return false, response.NewError(http.StatusInternalServerError, "参数转换失败")
	}

	if tx := global.DBClient.Create(&createUser); tx.Error != nil {
		global.Logger.Error("创建用户失败", zap.Any("model", model), zap.Error(tx.Error))
		return false, response.NewError(http.StatusInternalServerError, "创建用户失败")
	}

	global.Logger.Info("创建用户成功", zap.Any("model", model))
	return true, nil

}

// SearchUserList 查询用户信息
// Auth      		alittlexincan@163.com         							时间（2024/07/22 11:36）
// Update      		alittlexincan@163.com         							时间（2024/07/22 11:36）
// Param 			model				*dto.SearchUserListDto				查询用户参数
// Return 			*vo.SearchUserListVo									查询用户结果
// Return 			error													查询用户错误
func (user *UserService) SearchUserList(model *dto.SearchUserListDto) ([]*vo.SearchUserListVo, error) {

	var list []*po.User

	id := global.SnowFlakeId(model.Id)

	//tx := global.DBClient.Model(&po.User{}).Where(&po.User{Id: id}).Find(&list)
	if err := global.DBClient.Where(&po.User{Id: id}).Find(&list).Error; err != nil {
		global.Logger.Error("查询用户失败", zap.Any("model", model), zap.Error(err))
		return nil, response.NewError(http.StatusInternalServerError, "查询用户失败")
	}

	if len(list) == 0 {
		global.Logger.Info("查询用户成功, 暂无该用户数据", zap.Any("model", model))
		return nil, nil
	}

	// 将结果转换为vo
	var listVo []*vo.SearchUserListVo

	if mttErr := mapstructure.Decode(list, &listVo); mttErr != nil {
		global.Logger.Error("参数转换失败", zap.Any("model", model), zap.Error(mttErr))
		return nil, response.NewError(http.StatusInternalServerError, "参数转换失败")
	}

	global.Logger.Info("查询用户成功", zap.Any("model", model))
	return listVo, nil

}
